package middleware

import (
	"go-weiqi-system/config"
	"go-weiqi-system/internal/utils"
	"strings"

	"github.com/gin-gonic/gin"
)

// AuthUser 用户认证中间件
func AuthUser(cfg *config.Config) gin.HandlerFunc {
	return func(c *gin.Context) {
		token := c.GetHeader("Authorization")
		if token == "" {
			token = c.GetHeader("Token")
		}

		// 移除Bearer前缀
		token = strings.TrimPrefix(token, "Bearer ")

		if token == "" {
			utils.Unauthorized(c, "请先登录")
			c.Abort()
			return
		}

		claims, err := utils.ParseToken(token, cfg.JWTSecret)
		if err != nil {
			utils.Unauthorized(c, "登录已过期，请重新登录")
			c.Abort()
			return
		}

		// 将用户信息存储到上下文
		c.Set("user_id", claims.ID)
		c.Set("user_info", claims)

		c.Next()
	}
}

// AuthAdmin 管理员认证中间件
func AuthAdmin(cfg *config.Config) gin.HandlerFunc {
	return func(c *gin.Context) {
		token := c.GetHeader("Authorization")
		if token == "" {
			token = c.GetHeader("Token")
		}

		// 移除Bearer前缀
		token = strings.TrimPrefix(token, "Bearer ")

		if token == "" {
			utils.Unauthorized(c, "请先登录")
			c.Abort()
			return
		}

		claims, err := utils.ParseToken(token, cfg.JWTSecret)
		if err != nil {
			utils.Unauthorized(c, "登录已过期，请重新登录")
			c.Abort()
			return
		}

		// 验证是否为管理员（通过username字段判断）
		if claims.Username == "" {
			utils.Unauthorized(c, "无权限访问")
			c.Abort()
			return
		}

		// 将管理员信息存储到上下文
		c.Set("admin_id", claims.ID)
		c.Set("admin_info", claims)

		c.Next()
	}
}
